#include "qc.h"
#include "gpio.h"
#include "adc.h"
#include "usart.h"

int QC_Shake_Hand(void)
{
	DN_Set_Mode_In();
	DP_Set_Mode_Out(0);
	
	HAL_Delay(600);
	
	DP_Set_Mode_DAC(0.6);
	HAL_Delay(300);
	
	float dn_volt = Get_Dn_Volt();
	if( dn_volt > (float)0.65 || dn_volt < (float)0.55)
	{
		return 1;
	}
	
	HAL_Delay(1200);
	
	dn_volt = Get_Dn_Volt();
	
	if(dn_volt > (float)0.1)
	{
		return 2;
	}
	return 0;
}

void QC_Set_Volt(uint8_t volt)
{
	switch(volt)
	{
		case 5:
			DP_Set_Mode_DAC(0.6);   // D+ 0.6
			DN_Set_Mode_Out(0); 		// D- 0
			break;
		case 9:
			DP_Set_Mode_Out(1); 		// D+ 3.3
			DN_Set_Mode_DAC(0.6);   // D- 0.6
			break;
		case 12:
			DP_Set_Mode_DAC(0.6);   // D+ 0.6
			DN_Set_Mode_DAC(0.6);   // D- 0.6
			break;
		case 20:
			DP_Set_Mode_Out(1); 		// D+ 3.3
			DN_Set_Mode_Out(1); 		// D- 3.3
			break;
		case 0:
			DP_Set_Mode_DAC(0.6);   // D+ 0.6
			DN_Set_Mode_Out(1); 		// D- 3.3
			break;
		default:
			break;
	}
}

void QC_Continue_Adjust(uint8_t cmd)
{
	int i = 0;
	if((cmd & 0xF0) == 0x10) // up
	{
		for(i = 0; i < (cmd & 0x0F); i ++)
		{
			DP_Set_Mode_Out(1); 		// D+ 3.3
			HAL_Delay(2);
			DP_Set_Mode_DAC(0.6);    // D+ 0.6
			HAL_Delay(2);
		}
	}
	else // down
	{
		for(i = 0; i < (cmd & 0x0F); i ++)
		{
			DN_Set_Mode_DAC(0.6);   // D- 0.6
			HAL_Delay(2);
			DN_Set_Mode_Out(1);     // D- 3.3
			HAL_Delay(2);
		}
	}
}

void QC_CMD_Proc(uint8_t *data)
{
	switch(data[3])
	{
		case 0x00:
			QC_Shake_Hand();
			data[4] = 0;
			data[5] = 0;
			CMD_Response(data);
			break;
		case 0x01:
			QC_Set_Volt(data[6]);
			data[4] = 0;
			data[5] = 0;
			CMD_Response(data);
			break;
		case 0x02:
			QC_Continue_Adjust(data[6]);
			data[4] = 0;
			data[5] = 0;
			CMD_Response(data);
			break;
		default:
			break;
	}
}
